package org.al.poc.persistence.dao;

import java.util.*;
import javax.persistence.*;

/**
 * Classe représentant une connexion JPA à une BD.
 * Hérite de la classe Connexion.
 * @author Jérome
 */
public class ConnexionJpa implements Connexion {

	private EntityManagerFactory emf;
	private EntityManager em;
	private EntityTransaction tx;

	/**
	 * Initialise une connexion JPA à la BD
	 * @param persistUnit
	 * @param prop les propriétés de connexion à la BD
	 * @throws DaoException si un problème survient à la connexion.
	 */
	public ConnexionJpa (String persistUnit, Properties prop) throws DaoException {

		try {
			emf = Persistence.createEntityManagerFactory(persistUnit, prop);
			em = emf.createEntityManager();
			tx = em.getTransaction();
			tx.begin();
		}
		catch(Exception e) {
			throw new DaoException (e.getMessage(), e.getCause());
		}
	}
	
	/**
	 * Définit l'Entity Manager
	 * (pour compatibilité avec héritage)
	 * @param em
	 */
	protected void setEntityManager (EntityManager em) {
		this.em = em;
	}

	/**
	 * Retourne un gestionnaire d'entité.
	 * @return le gestionnaire d'entité.
	 */
	public EntityManager getEntityManager () {
		return em;
	}

	/**
	 * Ferme la connexion du gestionnaire d'entité.
	 * @throws DaoException si un problème survient à la fermeture.
	 */
	@Override
	public void close() throws DaoException {
		try {
			if (em.isOpen())  em.close();
			if (emf.isOpen()) emf.close();
		}
		catch (Exception e) {
			throw new DaoException (e.getMessage(), e.getCause());
		}
	}

	/**
	 * Effectue un commit des transactions dans la BD.
	 * @throws DaoException si un problème survient au commit.
	 */
	@Override
	public void commit() throws DaoException {
		try { 
			tx.commit(); 
		}
		catch (Exception e) {
			throw new DaoException (e.getMessage(), e.getCause());
		}
	}

	/**
	 * Effectue un rollback des transactions qui ont eu lieu depuis
	 * la connexion ou le dernier commit.
	 * @throws DaoException si un problème survient au moment du rollback.
	 */
	@Override
	public void rollback() throws DaoException {
		try { 
			tx.rollback(); 
		}
		catch (Exception e) {
			throw new DaoException (e.getMessage(), e.getCause());
		}
	}

	/**
	 * Ouvre une nouvelle transaction
	 */
	@Override
	public void begin() throws DaoException {
		if (! tx.isActive()) this.tx.begin();
	}

}
